﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using kk.components.contracts;
using kk.messages.contracts.DataModel;
using kk.messages.contracts.ViewModel;
using NUnit.Framework;

namespace kk.belegungsplanfactory.tests
{
    [TestFixture]
    public class testBelegungsplanFactory
    {
        [Test]
        public void Belegungsplan_aus_Quelldaten_zusammenstellen()
        {
            var bf = new BelegungsplanFactory();
            bf.OnBestuhlungZuSaalplan += req => req.ResponsePin(new Saalplan(new[]
                                                                                 {
                                                                                     new Platz(new Platzposition('A', 42), 'K'),
                                                                                     new Platz(new Platzposition('B', 666), 'T')
                                                                                 }));
            bf.OnPreiskategorien += req => req.ResponsePin(new[]
                                                               {
                                                                   new Preiskategorie('K', 3.14),
                                                                   new Preiskategorie('T', 2.67)
                                                               });
            bf.OnBelegungenZuVorstellung += req => req.ResponsePin(new[] {new Platzposition('B', 666)});


            Belegungsplan belegungsplan = null;
            bf.ProcessBelegungsplanZuVorstellung(new Request<Vorstellung, Belegungsplan>(
                                                     new Vorstellung("Silent Movie", DateTime.Now, "SaalX"), 
                                                     response => belegungsplan =response));

            var belegungen = belegungsplan.Plätze;
            Assert.AreEqual(2, belegungen.Count());

            Platzbelegung pb;
            pb = belegungen.First();
            Assert.AreEqual('A', pb.Position.Reihe);
            Assert.AreEqual(42, pb.Position.Platznummer);
            Assert.AreEqual('K', pb.Preiskategorie.KategorieSchlüssel);
            Assert.AreEqual(3.14, pb.Preiskategorie.Preis);
            Assert.IsFalse(pb.IstBelegt);

            pb = belegungen.Last();
            Assert.AreEqual('B', pb.Position.Reihe);
            Assert.AreEqual(666, pb.Position.Platznummer);
            Assert.AreEqual('T', pb.Preiskategorie.KategorieSchlüssel);
            Assert.AreEqual(2.67, pb.Preiskategorie.Preis);
            Assert.IsTrue(pb.IstBelegt);
        }
    }
}
